package org.mcflier.appuntamento.data.model.abstracts;

import java.sql.Timestamp;
import java.util.Date;
import java.util.List;

import org.mcflier.appuntamento.data.model.AlternativeTitle;
import org.mcflier.appuntamento.data.model.Genre;
import org.mcflier.appuntamento.data.model.Production;
import org.mcflier.appuntamento.data.model.interfaces.IMovie;
import org.mcflier.appuntamento.i18n.Country;
import org.mcflier.appuntamento.i18n.Language;

public abstract class AbstractMovie implements IMovie {
	
	public AbstractMovie(String id, String originalName){
		if(id == null || originalName == null)
			throw new NullPointerException("Movie: All parameters must not be null");
		
		this.setId(id);
		this.setOriginalName(originalName);
	}

	@Override
	public abstract String getId();
	
	protected abstract void setId(String id);

	@Override
	public abstract String getOriginalName();

	@Override
	public abstract void setOriginalName(String originalName);

	@Override
	public abstract AlternativeTitle getAlternativeName();

	@Override
	public abstract void setAlternativeName(AlternativeTitle alternativeName);

	@Override
	public abstract String getOverview();

	@Override
	public abstract void setOverview(String overview);

	@Override
	public abstract String getHomepage();

	@Override
	public abstract void setHomepage(String homepage);

	@Override
	public abstract String getTagline();

	@Override
	public abstract void setTagline(String tagline);

	@Override
	public abstract String getPosterPath();

	@Override
	public abstract void setPosterPath(String posterPath);

	@Override
	public abstract Date getReleaseDate();

	@Override
	public abstract void setReleaseDate(Date releaseDate);

	@Override
	public abstract int getRuntime();

	@Override
	public abstract void setRuntime(int runtime);

	@Override
	public abstract boolean isTracing();

	@Override
	public abstract void setTracing(boolean tracing);

	@Override
	public abstract void addProduction(Production production);

	@Override
	public abstract Production getProduction(int id);

	@Override
	public abstract Production getProduction(String name);

	@Override
	public abstract List<Production> getProductions();
	
	@Override
	public abstract Production removeProduction(int id);

	@Override
	public abstract void removeAllProductions();

	@Override
	public abstract void addGenre(Genre genre);

	@Override
	public abstract Genre getGenre(int id);

	@Override
	public abstract List<Genre> getGenres();
	
	@Override
	public abstract Genre removeGenre(int id);

	@Override
	public abstract void removeAllGenres();

	@Override
	public abstract void addProductionCountry(Country country);

	@Override
	public abstract Country getProductionCountry(String code);

	@Override
	public abstract List<Country> getProductionCountries();

	@Override
	public abstract Country removeProductionCountry(String code);

	@Override
	public abstract void removeAllProductionCountries();

	@Override
	public abstract String getAddedBy();

	@Override
	public abstract void setAddedBy(String addingSource);

	@Override
	public abstract Timestamp getAddedDate();

	@Override
	public abstract void setAddedDate(Timestamp date);

	@Override
	public abstract Language getTracingLanguage();

	@Override
	public abstract void setTracingLanguage(Language language);

	@Override
	public abstract boolean isTraced();

	@Override
	public abstract void setTraced(boolean traced);

	@Override
	public abstract Timestamp getTracedDate();

	@Override
	public abstract void setTracedDate(Timestamp date);

	@Override
	public abstract String getTracedSource();

	@Override
	public abstract void setTracedSource(String tracedSource);

	@Override
	public abstract String getDownloadLink();

	@Override
	public abstract void setDownloadLink(String link);
}